package com.manjusaka.create6.factory3;

/**
 * 抽象工厂模式
 * 简单工厂模式---通过参数来选择创建的工厂
 * 缺点：
 * 1：工厂类的职责过重
 * 2：如果增加需要的类，必须改变工厂类的结构，维护代码困难，违反了设计模式的开闭原则；
 * 工厂方法模式---解耦合
 * 优点：
 * 1：解决了简单工厂模式耦合度太高的问题，使用了接口/抽象类的多态来解决工厂类方法的调用问题；
 * 2：加入新的工厂不需要修改抽象的工厂类，但是要写新的工厂类兵集成或实现工厂的接口或者抽象类；
 * 3：抽象工厂隐藏了具体累的实现方式，用户不需要操作具体的类；
 * 缺点：
 * 1：一个工厂对应了一种产品的生成，增加一种新的产品需要增加一个新的工厂c
 * 抽象工厂模式---解决工厂方法模式增加新的产品就要增加新的工厂的模式。 ---方案：将相关的产品组成一个产品族，由同一个工厂生产；----工厂职能提升
 * <p>
 * Created by manjusaka on 2017/6/30.
 */
public class AbstractFactory {
    public static void main(String[] args){
        AbstractEFactory factory=new HaierFactory();
        factory.PCShow();
        factory.TVShow();
    }
}

/**
 * 电视产品
 */
abstract class TV {
    public abstract void disPlay();
}

class HaierTV extends TV {
    public void disPlay() {
        System.out.println("海尔电视启动");
    }
}

class SonnyTV extends TV {
    public void disPlay() {
        System.out.println("索尼电视启动");
    }
}

/**
 * 电脑产品
 */
abstract class PC {
    public abstract void disPlay();

}

class HaierPC extends PC {
    public void disPlay() {
        System.out.println("海尔电脑启动");
    }
}

class SonnyPC extends PC {
    public void disPlay() {
        System.out.println("索尼电脑启动");
    }
}

/**
 * 电子厂的功能
 */
interface EFactory {
    TV creatTV();

    PC creatPC();
}

abstract class AbstractEFactory implements EFactory {
    public void TVShow(){
        this.creatTV().disPlay();
    }
    public void PCShow(){
        this.creatPC().disPlay();
    }

}

class HaierFactory extends AbstractEFactory {
    public TV creatTV() {
        return new HaierTV();
    }

    public PC creatPC() {
        return new HaierPC();
    }
}

class SonnyFactory extends AbstractEFactory {
    public TV creatTV() {
        return new SonnyTV();
    }

    public PC creatPC() {
        return new SonnyPC();
    }
}


